#!/bin/php
<?php
require_once __DIR__ . '/vendor/autoload.php';
require_once __DIR__ . '/vendor/meract/core/src/RecursiveLoad.php';

use Meract\Core\{Database, SDR, Injector, ScriptBuilder};

// Инициализация контейнера
$injector = new Injector();
SDR::setInjector($injector);

// Константы проекта
define('PROJECT_DIR', __DIR__);
SDR::setValue('project_dir', PROJECT_DIR);
// Загрузка конфигурации
$config = require __DIR__ . '/config.php';
SDR::setValue('config', $config);
requireFilesRecursively(__DIR__. '/vendor/meract/core/src/Helpers');
ScriptBuilder::config($config['morph']['scripts'] ?? [
	"source" => base_path('app/scripts'),
	"output" => base_path('storage/scripts')
]);

// Инициализация базы данных
try {
    SDR::singleton(Database::class, fn() => Database::getInstance($config['database']));
    SDR::bind('pdo.connection', fn() => SDR::make(Database::class)->getPdo());
} catch (Exception $e) {
    die("Ошибка инициализации БД: " . $e->getMessage() . PHP_EOL);
}

// Обработка команды
if ($argc < 2) {
    die("Использование: php mrst <команда> [аргументы]" . PHP_EOL);
}

$commandName = $argv[1];
$commandFile = __DIR__ . "/meract/commands/{$commandName}.php";

if (!file_exists($commandFile)) {
    die("Ошибка: Команда '{$commandName}' не найдена." . PHP_EOL);
}

// Регистрация аргументов
SDR::setValue('command.args', array_slice($argv, 2));

// Выполнение команды
try {
    $command = require $commandFile;
    $commandInstance = SDR::make(get_class($command));
    $commandInstance->run();
} catch (Exception $e) {
    die("Ошибка выполнения: " . $e->getMessage() . PHP_EOL);
}
